package hard.监控二叉树;

/**
 * @author zhengTao
 * @version 1.0
 * @description: 监控二叉树
 * 局部最优：让叶子节点的父节点安摄像头，所用摄像头最少，整体最优：全部摄像头数量所用最少！  (后序遍历)
 * @date 2022/11/26 15:35
 */

public class Demo689 {
    int count=0;
    public int minCameraCover(TreeNode root) {

        //根节点是无覆盖状态，则加摄像头
        if(minCame(root)==0){
            count++;
        }
        return count;
    }
    //递归三部曲
    /**
     节点的状态值：
     0 表示无覆盖
     1 表示 有摄像头
     2 表示有覆盖
     后序遍历，根据左右节点的情况,来判读 自己的状态
     */
    private int minCame(TreeNode root) {
        //空节点，默认有覆盖状态
        //终止条件
        if(root==null){
            return 2;
        }
        int left=minCame(root.left);
        int right=minCame(root.right);
        //只要一个孩子是没覆盖状态，则父节点一定装摄像头
        if(left==0||right==0){
            // 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头
            // (0,0) (0,1) (0,2) (1,0) (2,0)
            // 状态值为 1 摄像头数 ++;
            count++;
            //左右孩子都没有覆盖，返回摄像头
            return 1;// 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头
        }else if(left==2&&right==2){
            return 0;
        }else {
            // 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头，
            // 那么本节点就是处于被覆盖状态
            return 2;
        }

    }

    //Definition for a binary tree node.
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

}
